<!DOCTYPE html>
<html>
<head>
    

    

    



    <meta charset="utf-8">
    
    
    
    
    <title>【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理） | ATOM 阿瞳目 | 欲穷千里目，更上一层楼</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    
    <meta name="theme-color" content="#3F51B5">
    
    
    <meta name="keywords" content="树莓派">
    <meta name="description" content="可能不少有树莓派的小伙伴都遇到过这样一个问题，长期不用但已经配置过的树莓派，刚开机会自动连接已经识别的wifi，如果没有wifi的管理密码，手头又没有可以显示的设备，手边也没有能读tf卡的机器，就只能面对默默亮灯的树莓派望洋兴叹了。 如果能在每次树莓派开机的时候自动获取连接的ip地址，并发送到自己的微信上，岂不是快捷又方便？就像这样 $↓↓↓$  ✿(。◕ᴗ◕。)✿     怎么实现呢？Pleas">
<meta property="og:type" content="article">
<meta property="og:title" content="【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）">
<meta property="og:url" content="https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/index.html">
<meta property="og:site_name" content="ATOM 阿瞳目">
<meta property="og:description" content="可能不少有树莓派的小伙伴都遇到过这样一个问题，长期不用但已经配置过的树莓派，刚开机会自动连接已经识别的wifi，如果没有wifi的管理密码，手头又没有可以显示的设备，手边也没有能读tf卡的机器，就只能面对默默亮灯的树莓派望洋兴叹了。 如果能在每次树莓派开机的时候自动获取连接的ip地址，并发送到自己的微信上，岂不是快捷又方便？就像这样 $↓↓↓$  ✿(。◕ᴗ◕。)✿     怎么实现呢？Pleas">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://img-blog.csdnimg.cn/20201112140509489.png?x-oss-process=image">
<meta property="og:image" content="https://img-blog.csdnimg.cn/20201112011817117.png?x-oss-process=image">
<meta property="og:image" content="https://img-blog.csdnimg.cn/20201112031651898.png?x-oss-process=image">
<meta property="og:image" content="https://img-blog.csdnimg.cn/20201112140303932.png?x-oss-process=image">
<meta property="article:published_time" content="2020-11-11T19:38:26.000Z">
<meta property="article:modified_time" content="2021-05-08T13:47:58.378Z">
<meta property="article:author" content="Richard Yann">
<meta property="article:tag" content="树莓派">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://img-blog.csdnimg.cn/20201112140509489.png?x-oss-process=image">
    
        <link rel="alternate" type="application/atom+xml" title="ATOM 阿瞳目" href="/atom.xml">
    
    <link rel="shortcut icon" href="/favicon.ico">
    <link rel="stylesheet" href="/css/style.css?v=1.7.2">
    <script>window.lazyScripts=[]</script>

	<link rel="stylesheet" href="/css/_partial/prism.css?v=1.7.2">
	
    <!-- custom head -->
    

<meta name="generator" content="Hexo 4.2.1"></head>

<body>
    <div id="loading" class="active"></div>

    <aside id="menu" class="hide" >
  <div class="inner flex-row-vertical">
    <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="menu-off">
        <i class="icon icon-lg icon-close"></i>
    </a>
    <div class="brand-wrap" style="background-image:url(/img/brand.jpg)">
      <div class="brand">
        <a href="/" class="avatar waves-effect waves-circle waves-light">
          <img src="/img/avatar.jpg">
        </a>
        <hgroup class="introduce">
          <h5 class="nickname">Richard Yann</h5>
          <a href="mailto:yanrichard500@gmail.com" title="yanrichard500@gmail.com" class="mail">yanrichard500@gmail.com</a>
        </hgroup>
      </div>
    </div>
    <div class="scroll-wrap flex-col">
      <ul class="nav">
        
            <li class="waves-block waves-effect">
              <a href="/"  >
                <i class="icon icon-lg icon-home"></i>
                主页
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/archives"  >
                <i class="icon icon-lg icon-archives"></i>
                归档
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/tags"  >
                <i class="icon icon-lg icon-tags"></i>
                标签
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="/categories"  >
                <i class="icon icon-lg icon-th-list"></i>
                分类
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="https://blog.csdn.net/weixin_42062018" target="_blank" rel="noopener"  >
                <i class="icon icon-lg icon-link"></i>
                CSDN
              </a>
            </li>
        
            <li class="waves-block waves-effect">
              <a href="https://github.com/RichardYann" target="_blank" >
                <i class="icon icon-lg icon-github"></i>
                Github
              </a>
            </li>
        
      </ul>
    </div>
  </div>
</aside>

    <main id="main">
        <header class="top-header" id="header">
    <div class="flex-row">
        <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light on" id="menu-toggle">
          <i class="icon icon-lg icon-navicon"></i>
        </a>
        <div class="flex-col header-title ellipsis">【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）</div>
        
        <div class="search-wrap" id="search-wrap">
            <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="back">
                <i class="icon icon-lg icon-chevron-left"></i>
            </a>
            <input type="text" id="key" class="search-input" autocomplete="off" placeholder="输入感兴趣的关键字">
            <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="search">
                <i class="icon icon-lg icon-search"></i>
            </a>
        </div>
        
        
        <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="menuShare">
            <i class="icon icon-lg icon-share-alt"></i>
        </a>
        
    </div>
</header>
<header class="content-header post-header">

    <div class="container fade-scale">
        <h1 class="title">【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）</h1>
        <h5 class="subtitle">
            
                <time datetime="2020-11-11T19:38:26.000Z" itemprop="datePublished" class="page-time">
  2020-11-12
</time>


	<ul class="article-category-list"><li class="article-category-list-item"><a class="article-category-list-link" href="/categories/%E7%9E%8E%E6%8A%98%E8%85%BE/">瞎折腾</a></li></ul>

            
        </h5>
    </div>

    


</header>


<div class="container body-wrap">
    
    <aside class="post-widget">
        <nav class="post-toc-wrap post-toc-shrink" id="post-toc">
            <h4>TOC</h4>
            <ol class="post-toc"><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#1-思路（可行性分析）："><span class="post-toc-text">1. 思路（可行性分析）：</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#2-获取ip地址"><span class="post-toc-text">2. 获取ip地址</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#3-注册企业微信号（无门槛）"><span class="post-toc-text">3. 注册企业微信号（无门槛）</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#4-调用api发送信息"><span class="post-toc-text">4. 调用api发送信息</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#4-1-新建应用"><span class="post-toc-text">4.1 新建应用</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#4-2-记住几个关键信息"><span class="post-toc-text">4.2 记住几个关键信息</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#4-3-获取access-token"><span class="post-toc-text">4.3 获取access_token</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#4-4-发送信息"><span class="post-toc-text">4.4 发送信息</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#4-5-赋予文件可执行权限并执行编写的脚本"><span class="post-toc-text">4.5 赋予文件可执行权限并执行编写的脚本</span></a></li></ol></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#5-设置开机自动运行"><span class="post-toc-text">5. 设置开机自动运行</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#6-重启自动执行不成功？"><span class="post-toc-text">6. 重启自动执行不成功？</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#6-1-添加环境变量，使cron开机能成功执行脚本"><span class="post-toc-text">6.1 添加环境变量，使cron开机能成功执行脚本</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#6-2-添加循环判断，在未连接时不断检测，连接后发送消息"><span class="post-toc-text">6.2 添加循环判断，在未连接时不断检测，连接后发送消息</span></a></li></ol></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#7-成功！"><span class="post-toc-text">7. 成功！</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#8-关于IP地址获取的改进"><span class="post-toc-text">8. 关于IP地址获取的改进</span></a></li><li class="post-toc-item post-toc-level-3"><a class="post-toc-link" href="#9-附：完整示例代码："><span class="post-toc-text">9.附：完整示例代码：</span></a></li></ol>
        </nav>
    </aside>


<article id="post-【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）"
  class="post-article article-type-post fade" itemprop="blogPost">

    <div class="post-card">
        <h1 class="post-card-title">【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）</h1>
        <div class="post-meta">
            <time class="post-time" title="2020-11-12 03:38:26" datetime="2020-11-11T19:38:26.000Z"  itemprop="datePublished">2020-11-12</time>

            
	<ul class="article-category-list"><li class="article-category-list-item"><a class="article-category-list-link" href="/categories/%E7%9E%8E%E6%8A%98%E8%85%BE/">瞎折腾</a></li></ul>



            

        </div>
        <div class="post-content" id="post-content" itemprop="postContent">
            <p>可能不少有树莓派的小伙伴都遇到过这样一个问题，长期不用但已经配置过的树莓派，刚开机会自动连接已经识别的wifi，如果没有wifi的管理密码，手头又没有可以显示的设备，手边也没有能读tf卡的机器，就只能面对默默亮灯的树莓派望洋兴叹了。</p>
<p>如果能在每次树莓派开机的时候自动获取连接的ip地址，并发送到自己的微信上，岂不是快捷又方便？就像这样 $↓↓↓$  ✿(。◕ᴗ◕。)✿ </p>
<center><img src="https://img-blog.csdnimg.cn/20201112140509489.png?x-oss-process=image" alt="在这里插入图片描述" style="zoom:67%;"/></center>


<p>怎么实现呢？Please follow me~ </p>
<hr>
<h3 id="1-思路（可行性分析）："><a href="#1-思路（可行性分析）：" class="headerlink" title="1. 思路（可行性分析）："></a>1. 思路（可行性分析）：</h3><ul>
<li>通过树莓派shell命令，可以获取ip地址</li>
<li>通过crontab定时任务功能，可实现开机执行特定脚本</li>
<li>企业微信号注册很方便，提供群发api接口，只需注册一个企业微信号，成员只有自己一个人，调用api接口可以向自己发送消息</li>
</ul>
<p>so，完全可以很方便的实现~</p>
<h3 id="2-获取ip地址"><a href="#2-获取ip地址" class="headerlink" title="2. 获取ip地址"></a>2. 获取ip地址</h3><p>这个应该是最简单的一步了吧，为了防止后面我忘了，就写在前面吧。<br><code>ifconfig</code>命令可以查看网络连接状态，用<code>|grep 192.168</code>筛选其中包含192.168的信息（毕竟我们只需要这个192.168.x.x的地址），再用<code>|awk -F net &#39;{print $2}&#39;</code>选择其中第一个地址，就是我们树莓派连接的ip地址了。<br>即：<code>ifconfig|grep 192.168|awk -F net &#39;{print $2}&#39;</code></p>
<blockquote>
<p><code>ifconfig</code>命令执行后包含192.168.x.x的信息应该只有两处，第一处是我们要用的ip地址inet，第二处则是broadcast。这两个信息都是在一行展示，所以用grep筛选后会是如下形式：<br><code>inet 192.168.1.4  netmask 255.255.255.0  broadcast 192.168.1.255</code><br>所以我们要再用awk的截取操作，我们发现要提取的ip地址处于两个“net”字符之间，因此我们设置截取的分隔符为“net”，则会将这段信息截成三部分，第一部分是”i”，第二部分是”192.168.1.4”，第三部分是”mask 255.255….”，我们要取的是第二部分，因此<code>print $2</code><br>&emsp;</p>
<ul>
<li>awk使用格式为：<code>|awk -F 分隔符 &#39;{命令}&#39;</code></li>
<li>grep使用格式为：<code>|grep 筛选内容</code></li>
</ul>
</blockquote>
<h3 id="3-注册企业微信号（无门槛）"><a href="#3-注册企业微信号（无门槛）" class="headerlink" title="3. 注册企业微信号（无门槛）"></a>3. 注册企业微信号（无门槛）</h3><p>点击进入→：<a href="https://work.weixin.qq.com/" target="_blank" rel="noopener">企业微信官网</a><br>按要求注册就行了，没有任何门槛，非常简单，略过不提。</p>
<h3 id="4-调用api发送信息"><a href="#4-调用api发送信息" class="headerlink" title="4. 调用api发送信息"></a>4. 调用api发送信息</h3><h4 id="4-1-新建应用"><a href="#4-1-新建应用" class="headerlink" title="4.1 新建应用"></a>4.1 新建应用</h4><p>在“应用管理&gt;应用&gt;自建”一栏中点击“创建应用”，根据提示创建一个应用即可。如图：</p>
<center><img src="https://img-blog.csdnimg.cn/20201112011817117.png?x-oss-process=image" alt="在这里插入图片描述" style="zoom:80%;"/></center>

<h4 id="4-2-记住几个关键信息"><a href="#4-2-记住几个关键信息" class="headerlink" title="4.2 记住几个关键信息"></a>4.2 记住几个关键信息</h4><ul>
<li>应用ID（AgentId)</li>
<li>秘钥（Secret）   （以上两个均可点进刚才创建的应用列表里找到）</li>
<li>企业ID（corpID） （在“我的企业&gt;企业信息”最下方找到“企业ID”）</li>
</ul>
<p>然后我们在树莓派上一个方便的目录下，创建一个.sh文件，比如叫作 AutoDetectIP.sh<br>打开编辑，首行按规矩先输入：</p>
<pre><code class="shell">#!/bin/bash</code></pre>
<p>回车换行，然后我们将上述信息赋值成变量：</p>
<pre><code class="shell">AgentId=xxxxx
Secret=xxxxx
corpId=xxxxx</code></pre>
<blockquote>
<p><strong>注1：</strong> shell赋值时等号左右不能空格！<br><strong>注2：</strong> 调用时要在变量前面加“$”，如输出AgentId：<code>echo $AgentId</code></p>
</blockquote>
<h4 id="4-3-获取access-token"><a href="#4-3-获取access-token" class="headerlink" title="4.3 获取access_token"></a>4.3 获取access_token</h4><p>需要用 get 方式请求网址，命令格式如下：<br>curl <a href="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&amp;corpsecret=SECRET" target="_blank" rel="noopener">https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&amp;corpsecret=SECRET</a><br>其中ID和SECRET分别填写上面记住的企业ID和秘钥</p>
<blockquote>
<p>curl请求时，不加参数默认就是get请求，后面直接跟网址即可。</p>
</blockquote>
<p>调用前面的变量，于是命令为：<br><code>curl https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpId&amp;corpsecret=$Secret</code><br>如果正确，会返回一串信息，其中包含我们需要的access_token和其生效时间。<br>我们可以把这段信息赋值给一个变量temp，于是命令又进一步改为：</p>
<pre><code class="shell">temp=`curl https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&amp;corpsecret=SECRET`</code></pre>
<blockquote>
<p>在shell脚本中反引号 ` 括起来的内容表示这是一段命令而不是字符串，也可以用$()括起来，但最好用前者。</p>
<ul>
<li><strong>注意：</strong> 要区分 $(命令) 和 ${变量}</li>
</ul>
</blockquote>
<p>这时temp中内容就包含了我们的access_token，接下来要截掉多与信息，依然使用前面提到的<code>|awk</code>操作：<br>观察所给信息格式，大致如下：</p>
<blockquote>
<p>如果错误，返回格式大致为：<br><code>{&quot;errcode&quot;:40001,&quot;errmsg&quot;:&quot;invalid credential, hint: [16051035.........], from ip: 111...., more info at https://open.work.weixin.qq.com/devtool/query?e=40001&quot;}</code><br>如果正确，返回格式大致为：<br><code>{&quot;errcode&quot;:0,&quot;errmsg&quot;:&quot;ok&quot;,&quot;access_token&quot;:&quot;.........................&quot;,&quot;expires_in&quot;:7200}</code></p>
</blockquote>
<p>我们可以将连续的双引号、冒号、双引号，即 “:” 作为分隔符，如果错误则只能得到2部分，如果正确则能得到3部分。且第三部分中如果我们再以 “,” 作为分隔符，则其中的第一部分就是纯净的access_token。因此，我们借助条件语句，代码如下：</p>
<pre><code class="shell">if [ -n `echo $temp|awk -F \&quot;:\&quot; &#39;{print $3}&#39;` ];then
    access_token=`echo $temp|awk -F \&quot;:\&quot; &#39;{print $3}&#39;|awk -F \&quot;,\&quot; &#39;{print $1}&#39;`
fi</code></pre>
<blockquote>
<ul>
<li>如果上述命令直接在控制台或要写成一行输入，则 fi 前面必须加分号；</li>
<li>if 后的判断框[ ]和里面的条件语句必须左右留有一个空格，即 [ 的右边和 ] 的左边必须空一格</li>
<li>参数 -n 表示如果参数长度不为0，则执行then，否则执行else（shell中如果else下没有命令就不能写，不可命令留空）；相反，参数 -z 表示如果参数长度为0，则执行then，否则执行else</li>
<li>双引号前面要加转义符 \ </li>
</ul>
</blockquote>
<p>至此，我们得到了access_token并将其存入了变量access_token中。</p>
<h4 id="4-4-发送信息"><a href="#4-4-发送信息" class="headerlink" title="4.4 发送信息"></a>4.4 发送信息</h4><p>需要用post方式请求网址，并用json传递结构化参数：<br><a href="https://work.weixin.qq.com/api/doc/90000/90135/90236" target="_blank" rel="noopener">官方文档</a>给出的参数示例为：</p>
<pre><code class="shell">{
   &quot;touser&quot; : &quot;UserID1|UserID2|UserID3&quot;,
   &quot;toparty&quot; : &quot;PartyID1|PartyID2&quot;,
   &quot;totag&quot; : &quot;TagID1 | TagID2&quot;,
   &quot;msgtype&quot; : &quot;text&quot;,
   &quot;agentid&quot; : 1,
   &quot;text&quot; : {
       &quot;content&quot; : &quot;你的快递已到，请携带工卡前往邮件中心领取。\n出发前可查看&lt;a href=\&quot;http://work.weixin.qq.com\&quot;&gt;邮件中心视频实况&lt;/a&gt;，聪明避开排队。&quot;
   },
   &quot;safe&quot;:0,
   &quot;enable_id_trans&quot;: 0,
   &quot;enable_duplicate_check&quot;: 0,
   &quot;duplicate_check_interval&quot;: 1800
}
</code></pre>
<p>post地址为：<a href="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN" target="_blank" rel="noopener">https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN</a><br>（ACCESS_TOKEN为刚获取到的内容）<br>将地址赋值给变量（要不然之后的命令太长了）：</p>
<pre><code class="shell">PostURL=&quot;https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$access_token&quot;</code></pre>
<p>用curl进行post请求，并以json传递参数，格式为：<br><code>curl -H &quot;Content-type: application/json&quot; -X POST -d ‘{参数}’ 网址</code></p>
<blockquote>
<p>其中，参数内容中如果要引用变量，需要先用双引号，再用单引号，再用双引号括起来，然后$变量名，例如：</p>
<pre><code class="shell">-X POST -d &#39;{&quot;touser&quot;:&quot;@all&quot;,&quot;msgtype&quot;:&quot;text&quot;,&quot;agentid&quot;:&quot;&#39;&quot;$AgentId&quot;&#39;&quot;,&quot;text&quot;,{&quot;content&quot;:&quot;IP地址为&#39;&quot;$IP&quot;&#39;&quot;}}&#39;</code></pre>
<p>参数中，msgtype、agetid、text、content是必须包含的参数，touser、toparty、totag三者至少需要包含一个<br>（IP变量没定义的记得先定义，方法如第2节所述命令，格式如前述：变量名=$`命令`  &lt;反引号括起来的都是命令&gt;）</p>
</blockquote>
<p>故发送消息命令为：</p>
<pre><code class="shell">curl -H &quot;Content-type: application/json&quot; -X POST -d &#39;{..如上..}&#39; $PostURL</code></pre>
<p>保存退出。</p>
<h4 id="4-5-赋予文件可执行权限并执行编写的脚本"><a href="#4-5-赋予文件可执行权限并执行编写的脚本" class="headerlink" title="4.5 赋予文件可执行权限并执行编写的脚本"></a>4.5 赋予文件可执行权限并执行编写的脚本</h4><p>赋予权限：<br><code>sudo chmod +x AutoDetectIP.sh</code></p>
<blockquote>
<p>+号代表赋予权限，-号代表剥夺权限，x表示可执行权限，r表示可读权限，w表示可写权限</p>
</blockquote>
<p>执行脚本文件：<br><code>./AutoDetectIP.sh</code></p>
<blockquote>
<p>默认用bash执行，执行时默认检查的是/etc、/bin等这些文件夹，一般我们用户操作的文件夹都不再检查范围内，所以要用 ./ 来强调从本文件夹中查找文件并执行（当然，得先进入文件夹，或者输入完整路径）</p>
</blockquote>
<p>出现如下提示且手机收到消息（需要提前扫描企业二维码关注企业，二维码在“我的企业&gt;微信插件&gt;邀请关注”中），则发送成功。</p>
<pre><code class="shell">  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   277  100   277    0     0    601      0 --:--:-- --:--:-- --:--:--   602
{&quot;errcode&quot;:0,&quot;errmsg&quot;:&quot;ok&quot;,&quot;invaliduser&quot;:&quot;&quot;}</code></pre>
<h3 id="5-设置开机自动运行"><a href="#5-设置开机自动运行" class="headerlink" title="5. 设置开机自动运行"></a>5. 设置开机自动运行</h3><p>我们使用crontab定时任务功能来实现。<br>在控制台终端输入<br><code>crontab -e</code><br>即可启动定时任务配置文件，第一次配置会提示选择编辑器，选择你习惯的编辑器或者直接回车也ok，即可进入文件进行配置，文件默认注释部分就是说明和示例，可以创建每隔多久运行一次的任务，只需按规则在文件后添加即可，且保存后如果机器重启，定时任务仍然有效。<br>格式为：</p>
<center><img src="https://img-blog.csdnimg.cn/20201112031651898.png?x-oss-process=image" alt="在这里插入图片描述" /></center>

<p>如：<br><code>0 0 * * * /home/pi/backup.sh</code>       表示每天00:00运行备份程序<br><code>*/5 * * * * python /home/pi/test.py</code>  表示每5分钟用python运行一次test.py程序<br><code>0 5 * * 1 sudo apt-get update -y; sudo apt-get upgrade -y</code>  表示每周一天05:00时更新apt软件包</p>
<blockquote>
<ul>
<li>星号（*）：代表所有可能的值，例如month字段如果是星号，则表示在满足其它字段的制约条件后每月都执行该命令操作；</li>
<li>逗号（,）：可以用逗号隔开的值指定一个列表范围，例如，“1,2,5,7,8,9”；</li>
<li>短横（-）：可以用在整数之间表示一个范围，例如“2-6”表示“2,3,4,5,6”；</li>
<li>斜线（/）：可以用正斜线指定时间的间隔频率，例如h位置处填“0-10/2”表示0点到10点间每两小时执行一次。同时斜线可以和星号一起使用，例如*/10，如果用在m位置，表示每十分钟执行一次。       </li>
</ul>
</blockquote>
<p>如果想要每次开机执行任务，只需在文件最后添加：<br><code>@reboot /home/pi/AutoDetectIP.sh</code><br>这里面需要根据你之前创建文件的位置输入<strong>完整路径</strong>，即表示每次开机自动运行此文件</p>
<p>保存退出即可。</p>
<h3 id="6-重启自动执行不成功？"><a href="#6-重启自动执行不成功？" class="headerlink" title="6. 重启自动执行不成功？"></a>6. 重启自动执行不成功？</h3><p>到这里可以说基本已经全部完成了。可能有的小伙伴兴冲冲地重启树莓派，满心期待的望着手机，结果却发现等了个寂寞。。。<br>怎么回事呢？<br>如果检查<code>sudo service cron status</code>确定cron计时任务正在运行的话，那么主要有两个原因：</p>
<ol>
<li>系统开机时默认的环境变量和系统完全启动后用户使用的环境变量不同，因此无法执行脚本</li>
<li>开机时执行脚本，但当时网络还没有配置好，并不能成功获取ip并发送消息</li>
</ol>
<p>因此，针对这两种情况我们分别进行调整。</p>
<h4 id="6-1-添加环境变量，使cron开机能成功执行脚本"><a href="#6-1-添加环境变量，使cron开机能成功执行脚本" class="headerlink" title="6.1 添加环境变量，使cron开机能成功执行脚本"></a>6.1 添加环境变量，使cron开机能成功执行脚本</h4><p>首先我们要确定在当前用户执行成功时，脚本所用到的环境变量。<br>我们可以在脚本末尾添加一行代码：（调试成功后记得删掉）<br><code>echo $PATH</code><br>再次运行，就可以得到当前运行所使用的环境变量，比如我的为：<br><code>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games</code><br>那么我们只需把这些环境变量手动添加到脚本中即可。<br>在脚本正文的第一行（在<code>#!/bin/bash</code>之下）添加如下代码即可：</p>
<pre><code class="shell">export PATH=&quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games&quot;</code></pre>
<h4 id="6-2-添加循环判断，在未连接时不断检测，连接后发送消息"><a href="#6-2-添加循环判断，在未连接时不断检测，连接后发送消息" class="headerlink" title="6.2 添加循环判断，在未连接时不断检测，连接后发送消息"></a>6.2 添加循环判断，在未连接时不断检测，连接后发送消息</h4><p>我们使用shell脚本中的while循环语句：</p>
<pre><code class="shell">while true; do $(echo `ifconfig|grep 192.168`)&amp;&amp; break;sleep 1;done;</code></pre>
<p>如上，表示不断循环，直到匹配192.168的内容非空时，跳出循环，循环间隔1s。</p>
<blockquote>
<p>为避免多重反引号歧义，我们内外分别用$(命令)和`命令`两种形式<br>我们将此句加入脚本文件中合适位置，就可以在运行后一直等待连接网络成功的第一时间向微信发送消息。（此句至少得放在所有使用curl这样与网络相关的命令之前）</p>
</blockquote>
<p>其次，为了保证启动时程序不影响其他启动内容，或不被系统过快切断，因此我们将crontab中的命令修改为<code>nohup + 命令+ &amp;</code>这样的静默不挂起运行方式：<br>控制台输入<code>crontab -e</code>进入编辑定时任务，将原来的命令修改为：</p>
<pre><code class="shell">@reboot nohup /home/pi/AutoDetectIP.sh &amp;</code></pre>
<h3 id="7-成功！"><a href="#7-成功！" class="headerlink" title="7. 成功！"></a>7. 成功！</h3><p>至此，所有步骤都结束了。我们就可以在每次树莓派开机时，通过微信自动收到所连接的ip地址消息提示了。</p>
<h3 id="8-关于IP地址获取的改进"><a href="#8-关于IP地址获取的改进" class="headerlink" title="8. 关于IP地址获取的改进"></a>8. 关于IP地址获取的改进</h3><p>上面关于本机IP地址的操作主要有两个，一是通过是否包含“192.168”字段来判断是否连接wifi，二是通过<code>|grep</code>、<code>|awk</code>等操作截取纯净的ip地址信息。</p>
<p>其中第一个判断方式应该来说是较为准确且稳定的，符合我们的使用目标。</p>
<p>但第二个提取操作却有可能因为网络环境的变化，或网络设置的调整，可能会有字段的位置或是中间内容的调整，使得截取出来的不一定再是纯净的ip地址。因此我们可以更换一种更为快捷的获取IP地址的方式：</p>
<pre><code class="shell">hostname -I</code></pre>
<p>很简单的命令不用任何操作，就可以直接输出树莓派所连接的ip地址。<br>当然，如果你连接的网络给你分配了ipv6地址的话，也会一并展示出来，如果需要再按需提取即可。比如我的输出如下：</p>
<pre><code class="shell">pi@raspberrypi:~ $ hostname -I
192.168.1.4 2409:80XXXXX（公网ip手动打码）XXXXX</code></pre>
<p>如果只需要提取前面的ipv4地址，那么同上用awk截取：</p>
<pre><code class="shell">echo `hostname -I|awk -F &#39; &#39; &#39;{print $1}&#39;`</code></pre>
<p>如果要赋值给变量$IP，那么用内外双重反引号会造成歧义，故可以在外面用$(命令)的方式：</p>
<pre><code class="bash">IP=$(echo `hostname -I|awk -F &#39; &#39; &#39;{print $1}&#39;`)</code></pre>
<p>如此即可提取出纯净的ipv4地址</p>
<hr>
<p>最终效果如图：</p>
<center><img src="https://img-blog.csdnimg.cn/20201112140303932.png?x-oss-process=image" alt="在这里插入图片描述" style="zoom:80%;" /></center>

<p>&emsp;<br>&emsp;<br>&emsp;<br>&emsp;</p>
<h3 id="9-附：完整示例代码："><a href="#9-附：完整示例代码：" class="headerlink" title="9.附：完整示例代码："></a>9.附：完整示例代码：</h3><pre><code class="shell">#!/bin/bash
###########################################
#####      created by RichardYann     #####
#####            2020-11-11           #####
#####  EmaiL:yanrichard500@gmail.com  #####
###########################################

# set PATH
export PATH=&quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games&quot;

# Global Variables
corpid=CORPID        # change to your own corpid
AgentId=AGENTID        # change to your own agentid
Secret=SECRET        # change to your own secret
getTokenURL=&quot;https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpid&amp;corpsecret=$Secret&quot;

# check netstat
while true; do $(echo `ifconfig|grep 192.168`)&amp;&amp; break;sleep 1;done;

# get token
temp=`curl $getTokenURL`
if [ -n `echo $temp|awk -F \&quot;:\&quot; &#39;{print $3}&#39;` ];then
    access_token=`echo $temp|awk -F \&quot;:\&quot; &#39;{print $3}&#39;|awk -F \&quot;,\&quot; &#39;{print $1}&#39;`
fi

# get postURL
PostURL=&quot;https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$access_token&quot;

# get ip
IP=$(echo hostname -I|awk -F &#39; &#39; &#39;{print $1}&#39;)        # change $1 to $2 if you wanna get ipv6 addr.(if you had)

# send post
curl -H &quot;Content-type: application/json&quot; -X POST -d &#39;{&quot;touser&quot;:&quot;@all&quot;,&quot;msgtype&quot;:&quot;text&quot;,&quot;agentid&quot;:&quot;&#39;&quot;$AgentId&quot;&#39;&quot;,&quot;text&quot;:{&quot;content&quot;:&quot;树莓派已经启动啦！！\n\nIP地址是：&#39;&quot;$IP&quot;&#39;\n\n快点连接控制吧~~&quot;},&quot;safe&quot;:0}&#39; $PostURL
</code></pre>

        </div>

        <blockquote class="post-copyright">
    
    <div class="content">
        
<span class="post-time">
    最后更新时间：<time datetime="2021-05-08T13:47:58.378Z" itemprop="dateUpdated">2021-05-08 21:47:58</time>
</span><br>


        
        原创不易，转载请注明出处哦~
        
    </div>
    
    <footer>
        <a href="https://richardyann.gitee.io">
            <img src="/img/avatar.jpg" alt="Richard Yann">
            Richard Yann
        </a>
    </footer>
</blockquote>

        
<div class="page-reward">
    <a id="rewardBtn" href="javascript:;" class="page-reward-btn waves-effect waves-circle waves-light">赏</a>
</div>



        <div class="post-footer">
            
	<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/" rel="tag">树莓派</a></li></ul>


            
<div class="page-share-wrap">
    

<div class="page-share" id="pageShare">
    <ul class="reset share-icons">
      <li>
        <a class="weibo share-sns" target="_blank" href="http://service.weibo.com/share/share.php?url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/&title=《【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）》 — ATOM 阿瞳目&pic=https://richardyann.gitee.io/img/avatar.jpg" data-title="微博">
          <i class="icon icon-weibo"></i>
        </a>
      </li>
      <li>
        <a class="weixin share-sns wxFab" href="javascript:;" data-title="微信">
          <i class="icon icon-weixin"></i>
        </a>
      </li>
      <li>
        <a class="qq share-sns" target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/&title=《【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）》 — ATOM 阿瞳目&source=欢迎光临~" data-title=" QQ">
          <i class="icon icon-qq"></i>
        </a>
      </li>
      <li>
        <a class="facebook share-sns" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/" data-title=" Facebook">
          <i class="icon icon-facebook"></i>
        </a>
      </li>
      <li>
        <a class="twitter share-sns" target="_blank" href="https://twitter.com/intent/tweet?text=《【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）》 — ATOM 阿瞳目&url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/&via=https://richardyann.gitee.io" data-title=" Twitter">
          <i class="icon icon-twitter"></i>
        </a>
      </li>
      <li>
        <a class="google share-sns" target="_blank" href="https://plus.google.com/share?url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/" data-title=" Google+">
          <i class="icon icon-google-plus"></i>
        </a>
      </li>
    </ul>
 </div>



    <a href="javascript:;" id="shareFab" class="page-share-fab waves-effect waves-circle">
        <i class="icon icon-share-alt icon-lg"></i>
    </a>
</div>



        </div>
    </div>

    
<nav class="post-nav flex-row flex-justify-between flex-row-reverse">
  

  
    <div class="waves-block waves-effect next">
      <a href="/2020/11/10/%E3%80%90%E6%8A%80%E5%B7%A7%E3%80%91Edge%E6%B5%8F%E8%A7%88%E5%99%A8%E6%9B%B4%E6%8D%A2chrome%E4%B8%BB%E9%A2%98%E3%80%81%E9%80%89%E9%A1%B9%E5%8D%A1%E6%82%AC%E6%B5%AE%E9%A2%84%E8%A7%88%EF%BC%88%E5%BC%80%E5%90%AF%E5%AE%9E%E9%AA%8C%E5%8A%9F%E8%83%BD%EF%BC%89/" id="post-next" class="post-nav-link">
        <div class="tips">Next <i class="icon icon-angle-right icon-lg icon-pl"></i></div>
        <h5 class="title">【技巧】Edge浏览器更换chrome主题、选项卡悬浮预览（开启实验功能）</h5>
      </a>
    </div>
  
</nav>



    











    <!-- Valine Comments -->
    <div class="comments vcomment" id="comments"></div>
    <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
    <script src="//unpkg.com/valine@latest/dist/Valine.min.js"></script>
    <!-- Valine Comments script -->
    <script>
        var GUEST_INFO = ['nick','mail','link'];
        var guest_info = 'nick,mail,link'.split(',').filter(function(item){
          return GUEST_INFO.indexOf(item) > -1
        });
        new Valine({
            el: '#comments',
            notify: 'false' == 'true',
            verify: 'false' == 'true',
            appId: "M4yQMNFFRkn5MlX8nVut4Bns-gzGzoHsz",
            appKey: "2GXS36F9dMO6lib96qjPLtIr",
            avatar: "mm",
			visiter: "false",
            placeholder: "说点儿什么吗...",
            guest_info: guest_info.length == 0 ? GUEST_INFO : guest_info,
            pageSize: "10"
        })
    </script>
    <!-- Valine Comments end -->









</article>

<div id="reward" class="page-modal reward-lay">
    <a class="close" href="javascript:;"><i class="icon icon-close"></i></a>
    <h3 class="reward-title">
        <i class="icon icon-quote-left"></i>
        你这么好看，不会介意请我杯咖啡吧~
        <i class="icon icon-quote-right"></i>
    </h3>
    <div class="reward-content">
        
        <div class="reward-code">
            <img id="rewardCode" src="/img/wechat.jpg" alt="打赏二维码">
        </div>
        
        <label class="reward-toggle">
            <input id="rewardToggle" type="checkbox" class="reward-toggle-check"
                data-wechat="/img/wechat.jpg" data-alipay="/img/alipay.jpg">
            <div class="reward-toggle-ctrol">
                <span class="reward-toggle-item wechat">微信</span>
                <span class="reward-toggle-label"></span>
                <span class="reward-toggle-item alipay">支付宝</span>
            </div>
        </label>
        
    </div>
</div>



</div>

        <footer class="footer" style="position:fixed;bottom:0;width:100%">
<!--
    <div class="top">
        

        <p>
            
                <span><a href="/atom.xml" target="_blank" class="rss" title="rss"><i class="icon icon-lg icon-rss"></i></a></span>
            
            <span>博客内容遵循 <a rel="license noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target="_blank">知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议</a></span>
        </p>
    </div>
-->
    <div class="bottom">
        <p><span>Richard Yann &copy; 2020 - 2021</span>
<!--
            <span>
                
                Power by <a href="http://hexo.io/" target="_blank">Hexo</a> Theme <a href="https://github.com/yscoder/hexo-theme-indigo" target="_blank">indigo</a>
            </span>
--!>
        </p>
    </div>
	
	<script src="/js/prism/prism.min.js?v=1.7.2" async></script>
</footer>

    </main>
    <div class="mask" id="mask"></div>
<a href="javascript:;" id="gotop" class="waves-effect waves-circle waves-light"><span class="icon icon-lg icon-chevron-up"></span></a>



<div class="global-share" id="globalShare">
    <ul class="reset share-icons">
      <li>
        <a class="weibo share-sns" target="_blank" href="http://service.weibo.com/share/share.php?url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/&title=《【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）》 — ATOM 阿瞳目&pic=https://richardyann.gitee.io/img/avatar.jpg" data-title="微博">
          <i class="icon icon-weibo"></i>
        </a>
      </li>
      <li>
        <a class="weixin share-sns wxFab" href="javascript:;" data-title="微信">
          <i class="icon icon-weixin"></i>
        </a>
      </li>
      <li>
        <a class="qq share-sns" target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/&title=《【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）》 — ATOM 阿瞳目&source=欢迎光临~" data-title=" QQ">
          <i class="icon icon-qq"></i>
        </a>
      </li>
      <li>
        <a class="facebook share-sns" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/" data-title=" Facebook">
          <i class="icon icon-facebook"></i>
        </a>
      </li>
      <li>
        <a class="twitter share-sns" target="_blank" href="https://twitter.com/intent/tweet?text=《【实现】树莓派开机自动向微信发消息报告ip地址（无第三方代理）》 — ATOM 阿瞳目&url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/&via=https://richardyann.gitee.io" data-title=" Twitter">
          <i class="icon icon-twitter"></i>
        </a>
      </li>
      <li>
        <a class="google share-sns" target="_blank" href="https://plus.google.com/share?url=https://richardyann.gitee.io/2020/11/12/%E3%80%90%E5%AE%9E%E7%8E%B0%E3%80%91%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E5%90%91%E5%BE%AE%E4%BF%A1%E5%8F%91%E6%B6%88%E6%81%AF%E6%8A%A5%E5%91%8Aip%E5%9C%B0%E5%9D%80%EF%BC%88%E6%97%A0%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BB%A3%E7%90%86%EF%BC%89/" data-title=" Google+">
          <i class="icon icon-google-plus"></i>
        </a>
      </li>
    </ul>
 </div>


<div class="page-modal wx-share" id="wxShare">
    <a class="close" href="javascript:;"><i class="icon icon-close"></i></a>
    <p>扫一扫，分享到微信</p>
    <img src="" alt="微信分享二维码">
</div>




    <script src="//cdn.bootcss.com/node-waves/0.7.4/waves.min.js"></script>
<script>
var BLOG = { ROOT: '/', SHARE: true, REWARD: true };


</script>

<script src="/js/main.min.js?v=1.7.2"></script>


<div class="search-panel" id="search-panel">
    <ul class="search-result" id="search-result"></ul>
</div>
<template id="search-tpl">
<li class="item">
    <a href="{path}" class="waves-block waves-effect">
        <div class="title ellipsis" title="{title}">{title}</div>
        <div class="flex-row flex-middle">
            <div class="tags ellipsis">
                {tags}
            </div>
            <time class="flex-col time">{date}</time>
        </div>
    </a>
</li>
</template>

<script src="/js/search.min.js?v=1.7.2" async></script>



<!-- mathjax config similar to math.stackexchange -->

<script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
		displayMath: [ ['$$','$$'] ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    }
});

MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';
    }
});
</script>

<script async src="//cdn.bootcss.com/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML" async></script>






<script>
(function() {
    var OriginTitile = document.title, titleTime;
    document.addEventListener('visibilitychange', function() {
        if (document.hidden) {
            document.title = '别走~待会儿~嘛去~';
            clearTimeout(titleTime);
        } else {
            document.title = 'Welcome to ATOM！';
            titleTime = setTimeout(function() {
                document.title = OriginTitile;
            },2000);
        }
    });
})();
</script>



</body>
<script type="text/javascript" src="//js.mfpad.com/mfsapi.js"></script>
</html>
